package com.touzhijia.common.controller;

import com.fasterxml.jackson.core.JsonEncoding;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

/**
 * Spring MVC 配置
 * Created by lzw on 2017/3/3.
 */
@Configuration
public class CustomWebMvcConfigurer extends WebMvcConfigurerAdapter {

    /**
     * 自定义静态资源访问映射
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/html/**")
                .addResourceLocations("classpath:/html/**")
                .setCachePeriod(3600 * 24 * 365)
                .resourceChain(true);
    }

    /**
     * 确定MIME类型<br/>
     * 1、检查扩展名（如action.json）；<br/>
     * 2、检查Parameter（如action?format=xml）；<br/>
     * 3、检查Accept Header<br/>
     */
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        // 是否根据URL后缀名确定MIME类型,例如：/userinfo/lzw.json 启用
        configurer.favorPathExtension(true);
        // 是否根据请求参数确定MIME类型,例如：?format=json 禁用
        configurer.favorParameter(false);
        // 根据请求参数确定MIME类型时,请求参数的参数名,默认：?format=xxx
        configurer.parameterName("format");
        // 不使用Accept确定MIME类型
        configurer.ignoreAcceptHeader(true);
        // 根据请求参数值和MIME类型的映射列表
        configurer.mediaType("xml", MediaType.APPLICATION_XML);
        configurer.mediaType("json", MediaType.APPLICATION_JSON);
        // 默认的content type
        configurer.defaultContentType(MediaType.TEXT_HTML);
    }

    /**
     * 配置视图解析器
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
        jsonView.setEncoding(JsonEncoding.UTF8);
        jsonView.setModelKey(BaseController.XML_OR_JSON_ROOT);
        jsonView.setExtractValueFromSingleKeyModel(true);
        registry.enableContentNegotiation(jsonView);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

    }
}
